/* Includes ------------------------------------------------------------------*/
#include <main.h>

/* Private define-------------------------------------------------------------*/

/* Private variables----------------------------------------------------------*/
static void GPIO_Init();
static void Power_ON_indication();
static void Sys_Init();
static void IE_Init();
/* Public variables-----------------------------------------------------------*/
Hradware_t Hradware = 
{
    GPIO_Init,
    Power_ON_indication,
    Sys_Init,
    IE_Init
};
/* Private function prototypes------------------------------------------------*/

/*
* @name   GPIO_Init
* @brief  GPIO初始化
* @param  None
* @retval None   
*/
static void GPIO_Init()
{
    //M1    M0
    //0     0       准双向口
    //0     1       推挽输出
    //1     0       高阻输入
    //1     1       开漏

    //P0
    //P00、P01设置为推挽输出
    //P02、P03设置为开漏输出，P02是WIFI_EN，P03是WIFI_RST
    P0M1 = 0x0C;    //0000 1100
    P0M0 = 0x0F;    //0000 1111

    P0 = 0x00;
    
    //P1
    //P10设置为高阻输入，是MCU_RXD2，接到WIFI模块的TXD0
    //P11设置为推挽输出，是MCU_TXD2，接到WIFI模块的RXD0
    //P12、P15设置为推挽输出
    //P13设置为推挽输出，SW_NTC，使能NTC工作
    //P14设置为高阻输入，NTC电压输入引脚，ADC进行转换

    P1M1 = 0x11;    //0001 0001
    P1M0 = 0x2E;    //0010 1110
    
    //P13口初始化为0
    P12 = 0;
    P13 = 0;
    P15 = 0;

    //P2
    //P20设置为推挽输出，连接到DE_nRE1，RS-485芯片开关引脚
    //P21、P27设置为推挽输出，
    //P24、P25、P26设置为开漏输出，连接到TM1620，分别对应TM1620_DIN、TM1620_CLK、TM1620_STB
    P2M1 = 0x70;    //0111 0000
    P2M0 = 0xF3;    //1111 0011
    
    //P20口初始化为0
    P20 = 0;
    P21 = 0;
    P27 = 0;

    //P3
    //P31设置为推挽输出，P31是串口1的TXD
    //P30、P32和P33设置为高阻输入，P32为按键1，P33为按键2，P30是串口1的RXD
    //P34和P35设置为推挽输出，P34接到运行指示灯，P35接到PWM灯
    //P36设置为高阻输入，P36是MCU_RXD1，接到RS-485
    //P37设置为推挽输入，P37是MCU_TXD1，接到RS-485
    P3M1 = 0x4D;    //0100 1101
    P3M0 = 0xB2;    //1011 0010

    // P34 = 0;        //关闭运行指示灯
    // P35 = 0;        //关闭PWM灯
    P3 &= (~(BIT4|BIT5));       //组合写法

    //P5
    P5M1 = 0x00;     //0000 0000
    P5M0 = 0xFF;     //1111 1111
	//P54引脚置高电平，打开PMOS开关，给外设供电
    P54 = 1;
    P55 = 0;
}

/*
* @name   Power_ON_indication
* @brief  系统上电运行指示
* @param  None
* @retval None   
*/
static void Power_ON_indication()
{
    uint8_t i = 5;
    while(i--)
    {
        //打开运行指示灯
        Run_LED.Run_LED_ON();
        //延时
        Public.Delay_ms(100);
        //关闭运行指示灯
        Run_LED.Run_LED_OFF();
        //延时
        Public.Delay_ms(100);
    }
}

/*
* @name   IE_Init
* @brief  中断初始化
* @param  None
* @retval None   
*/
static void IE_Init()
{
    IT0 = 1;     //外部中断0选择下降沿触发
    EX0 = 1;     //打开外部中断0

    ET0 = 1;     //打开定时器0中断

    ES  = 1;     //打开串口1中断

    IE2 |= BIT0;    //打开串口2中断

    EA = 1;      //打开总中断
}

/*
* @name   Sys_Init
* @brief  系统初始化
* @param  None
* @retval None   
*/
static void Sys_Init()
{
    Public.Delay_ms(10);               //上电延时50ms
    Hradware.GPIO_Init();              //GPIO口初始化
    Timer0.Timer0_Init();              //定时器0初始化
    Hradware.IE_Init();                //中断初始化
    PWM.PWM_Init();                     //PWM初始化
    UART1.UART_Init();                 //串口1初始化
    UART2.UART_Init();                  //串口2初始化
    ADC.ADC_Init();                    //ADC初始化
    TM1620.TM1620_Init();              //数码管TM1620初始化
    ESP8266.Init();                    //WIFI模块初始化
    WatchDog.Init();                    //看门狗初始化
    Hradware.Power_ON_indication();    //上电指示
}


/********************************************************
  End Of File
********************************************************/